/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package pop3proxy.client;

import java.io.*;
import java.util.concurrent.Semaphore;
import pop3proxy.persistence.Account;
import pop3proxy.persistence.AccountManager;

/**
 * Dieser Thread ist für die Kommunikation zwischen Client und User
 * zuständig. Er beendet den Proxy-Hauptthread durch das ihm beim Erzeugen
 * übergebene Semaphore.
 * Die Hauptaufgabe ist das Verwalten der Accounts.
 */
class ClientConsoleThread extends Thread {
    private AccountManager accountManager;
    private Semaphore quit;
    private BufferedReader console = new BufferedReader(new InputStreamReader(System.in));

    public ClientConsoleThread(AccountManager accountManager, Semaphore quit) {
        this.accountManager = accountManager;
        this.quit = quit;
    }
    
    @Override
    public void run() {
        String choice = "";
        do {
          try {
            printMenue();
            choice = console.readLine();
            switch (choice) {
                case "1":
                    accountManager.addAccount(createAccount());
                    saveAccounts();
                    break;
                case "2":
                    listAccounts();
                    break;
                case "3":
                    editAccount();
                    saveAccounts();
                    break;
                case "4":
                    deleteAccount();
                    saveAccounts();
                    break;
            }
          } catch (IOException e) {} //Ignore it!
        } while (!choice.equals("0"));
        saveAccounts();
        quit.release();
    }
    
    private void printMenue() {
        System.out.println("\n\nPOP3-Proxy Konsole:\n");
        System.out.println("(1) Account anlegen");
        System.out.println("(2) Accounts auflisten");
        System.out.println("(3) Account bearbeiten");
        System.out.println("(4) Account löschen\n");
        System.out.println("(0) Programm beenden");
    }
    
    private Account createAccount() throws IOException {
        String username, hostname, password;
        int port;
        
        System.out.println("Account anlegen:\n");
        System.out.print("Username: ");
        username = console.readLine();
        System.out.print("Passwort: ");   
        password = console.readLine();
        System.out.print("Hostname: ");
        hostname = console.readLine();
        System.out.print("Portnummer: ");
        port = Integer.parseInt(console.readLine());
        
        return new Account(username, password, hostname, port);
    }
    
    private void editAccount() throws IOException {
        System.out.println("Welcher Account soll geändert werden?");
        Account account = selectAccount();
        if (account != null) {
            System.out.println("Was soll geändert werden?\n");
            System.out.println("(1) Username: " + account.username);
            System.out.println("(2) Password: *****");
            System.out.println("(3) Hostname: " + account.hostname);
            System.out.println("(4) Portnummer: " + account.port);
            System.out.println("\n(0) Abbrechen");
            String choice = console.readLine();
            
            switch (choice) {
                case "1":
                    System.out.print("Neuen Usernamen eingeben: ");
                    account.username = console.readLine();
                    System.out.println("Username wurde geändert");
                    account.active = true;
                    break;
                case "2":
                    System.out.print("Neues Passwort eingeben: ");
                    account.password = console.readLine();
                    System.out.println("Password wurde geändert");
                    account.active = true;
                    break;
                case "3":
                    System.out.print("Neuen Hostnamen eingeben: ");
                    account.hostname = console.readLine();
                    System.out.println("Hostname wurde geändert");
                    account.active = true;
                    break;
                case "4":
                    System.out.print("Neue Portnummer eingeben: ");
                    account.port = Integer.parseInt(console.readLine());
                    System.out.println("Portnummer wurde geändert");
                    account.active = true;
                    break;
                default:
                    return;
            }
        }
    }
    
    private void deleteAccount() throws IOException {
        System.out.println("Welcher Account soll gelöscht werden?");
        Account account = selectAccount();
        if (account != null) {
            accountManager.removeAccount(account);
            System.out.println("Account wurde erfolgreich gelöscht");
        }
            
    }
    
    private void listAccounts() {
        System.out.println(accountManager.size() + " Accounts\n");
        int accounts = 1;
        for(Account acc : accountManager) {
            System.out.println("(" + accounts + ") " + acc.username + " Host: " + acc.hostname + "\t" + (acc.active?"(aktiv)":"(inaktiv)"));
            ++accounts;
        }
    }
    
    private Account selectAccount() throws IOException {
        listAccounts();
        System.out.println("\n(0) Abbrechen");
        String choice = console.readLine();
        if (choice.equals("0"))
            return null;
        
        int index = Integer.parseInt(choice) - 1;
        if (index >= accountManager.size()) {
            System.err.println("Account existiert nicht!");
            return null;
        } else {
            return accountManager.get(index);
        }
    }
    
    private void saveAccounts() {
        try {
            ObjectOutputStream writer = new ObjectOutputStream(new FileOutputStream(Client.configFile));
            writer.writeObject(accountManager);
        } catch (IOException ex) {
            System.err.println("Accounts konnten nicht gespeichert werden!");
            System.err.println(ex);
        }
    }
}
